import java.util.Iterator;
import javax.print.attribute.standard.MediaSize.Other;

public class Persoon {
	protected int BSN;
	protected String voornaam;
	protected String achternaam;
	protected char geslacht;
	protected Datum geboorteDatum;
	protected Dienblad dienblad;
	protected Betaalwijze betaal;
	
	//Constructor
	
	/**
	 * Constructor voor de klasse Persoon.
	 */
	public Persoon( int BSN, String voornaam, String achternaam, char geslacht, int dag, int maand, int jaar ) {
		this.BSN = BSN;
		this.voornaam = voornaam;
		this.achternaam = achternaam;
		this.geslacht = geslacht;
		this.geboorteDatum = new Datum( dag, maand, jaar );
	}
	
	/**
	 * Methode om dienblad te koppelen aan Persoon.
	 * @param dienblad
	 */
	public void pakDienblad( Dienblad dienblad) {
		this.dienblad = dienblad; 
	}
	
	/**
	 * Methode om artikel toe te voegen aan dienblad van Persoon.
	 * @param artikel
	 */
	public void pakArtikel( Artikel artikel ) {
		dienblad.voegToe( artikel ); 
	}
	
	
	//Setters
	
	/**
	 * Set de variable BSN.
	 * Dit moet een integer zijn.
	 * @param BSN
	 */
	public void setBSN( int BSN ) {
		this.BSN = BSN;
	}
	
	/**
	 * Set de variable voornaam.
	 * Dit moet een String zijn.
	 * @param voornaam
	 */
	public void setVoornaam( String voornaam ) {
		this.voornaam = voornaam;
	}
	
	/**
	 * Set de variable achternaam.
	 * Dit moet een String zijn.
	 * @param achternaam
	 */
	public void setAchternaam( String achternaam ) {
		this.achternaam = achternaam;
	}
	
	/**
	 * Set de variable geboorteDatum.
	 * Dit gaat aan de hand van een dag, maand en jaar.
	 * Vervolgens wordt er d.m.v. de klasse Datum een waarde toegekend aan geboorteDatum.
	 * @param Datum
	 */
	public void setGeboorteDatum( int dag, int maand, int jaar ) {
		this.geboorteDatum = new Datum( dag, maand, jaar );
	}
	
	/**
	 * Set de variable geslacht.
	 * Dit moet een char zijn.
	 * @param geslacht
	 */
	public void setGeslacht( char geslacht ) {
		this.geslacht = geslacht;		
	}

	/**
	 * Set de betaalwijze.
	 * Dit moet contant of pinpas zijn.
	 * @param betaal
	 */
	public void setBetaalwijze( String betaal ) {
		if( betaal.equalsIgnoreCase( "contant" ) ) {
			this.betaal = new Contant();
		} else if( betaal.equalsIgnoreCase( "pinpas" )) {
			this.betaal = new Pinpas();
		}
	}

	
	//Getters
	
	/**
	 * Geeft de waarde van BSN terug.
	 * Deze waarde is een integer.
	 * @return BSN
	 */
	public int getBSN() {
		return BSN;
	}
	
	/**
	 * Geeft de waarde van voornaam terug.
	 * Deze waarde is een String.
	 * @return voornaam
	 */
	public String getVoornaam() {
		return voornaam;
	}
	
	/**
	 * Geeft de waarde van achternaam terug.
	 * Deze waarde is een String.
	 * @return achternaam
	 */
	public String getAchternaam() {
		return achternaam;
	}
	
	/**
	 * Geeft de waarde van geslacht terug.
	 * Deze waarde is een String.
	 * Als de waarde van geslacht anders is dan een M/m of een V/v dan wordt er onbekend terug gestuurd.
	 * Als de waarde een M/m is wordt er Man gereturnd en als de waarde V/v is dan wordt er Vrouw terug gestuurd.
	 * @return geslacht
	 */
	public String getGeslacht() {
		// Converteert char naar String.
		String ges = Character.toString( geslacht );
		// Vergelijkt en kijkt niet naar hoofdletters.
		if( ges.equalsIgnoreCase( "m" ) || ges.equalsIgnoreCase( "v" ) ) { 
			if( ges.equalsIgnoreCase( "m" ) ) { 
				// Als het waarde m is geeft hij Man terug.
				return "Man"; 
			} else {
				// Als het waarde v is geeft hij Vrouw terug.
				return "Vrouw"; 
			}
		} else {
			// Geeft anders Onbekend terug.
			return "Onbekend" ; 
		}
	}

	/**
	 * Methode om te kijken of een persoon gelijk is.
	 * @return boolean
	 */
	public boolean equals( Persoon persoon )  {
		//Vergelijk personen op BSN nummer, deze hoort uniek te zijn
		//Als dit object en het andere object op dezelfde geheugen lokatie zitten zijn ze altijd hetzelfde
		if( this == persoon ) {
			return true;
		}
		//Als persoon naar niks verwijst zijn ze niet hetzelfde
		if( persoon == null ) {
			return false;
		}
		//Kijk of de BSN nummers(unieke code) gelijk zijn
		return ( this.getBSN() == persoon.getBSN() );
		
	}
	
	/**
	 * Geeft de waarde van geboorteDatum terug.
	 * Deze waarde is een String.
	 * @return geboorteDatum
	 */
	public String getGeboorteDatum() {
		return geboorteDatum.toString();
	}
	
	/**
	 * Geeft de totaal prijs van alle artikel die Persoon op zijn dienblad heeft terug.
	 * @return de totale prijs per dienblad.
	 */
	public double getTotaalPrijs() {
		return dienblad.getTotaalPrijs(); 
	}
	
	/**
	 * Geeft aantal artikelen die Persoon op zijn dienblad heeft terug.
	 * @return Aantal artikelen op dienblad.
	 */
	public int getAantalArtikelen() {
		return dienblad.getAantalArtikelen();
	}
	
	/**
	 * Iterator over dienblad met alle artikelen
	 * @return Iterator over dienblad met alle artikelen
	 */
	public Dienblad getDienblad() {
		return dienblad;
	}
	
	/**
	 * Geeft de betaalwijze terug.
	 * @return betaal
	 */
	public Betaalwijze getBetaalwijze() {
		return betaal;
	}
	
	/**
	 * Geeft Alle variable terug in de vorm van een String terug.
	 */
	public String toString() {
		return 	"BSN: " + getBSN() +
				"\nVoornaam: " + getVoornaam() +
				"\nAchternaam: " + getAchternaam() +
				"\nGeslacht: " + getGeslacht() +
				"\nGebootedatum: " + getGeboorteDatum();
	}
}
